#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <amqp.h>
#include <amqp_tcp_socket.h>
#include <unistd.h>

int main() {
    // 创建连接状态对象
    amqp_connection_state_t conn = amqp_new_connection();
    
    // 创建TCP套接字
    amqp_socket_t *socket = amqp_tcp_socket_new(conn);
    if (!socket) {
        fprintf(stderr, "创建套接字失败\n");
        return 1;
    }
    
    // 连接到RabbitMQ服务器
    int status = amqp_socket_open(socket, "localhost", 5672);
    if (status) {
        fprintf(stderr, "连接RabbitMQ服务器失败\n");
        return 1;
    }
    
    // 登录到服务器
    amqp_rpc_reply_t reply = amqp_login(conn, "/", 0, 131072, 0, 
                                       AMQP_SASL_METHOD_PLAIN, 
                                       "guest", "guest");
    if (reply.reply_type != AMQP_RESPONSE_NORMAL) {
        fprintf(stderr, "登录失败\n");
        return 1;
    }
    
    // 打开通道
    const int channel = 1;
    amqp_channel_open(conn, channel);
    reply = amqp_get_rpc_reply(conn);
    if (reply.reply_type != AMQP_RESPONSE_NORMAL) {
        fprintf(stderr, "打开通道失败\n");
        return 1;
    }
    
    // 声明队列
    amqp_queue_declare_ok_t *r = amqp_queue_declare(
        conn,                         // 连接句柄
        channel,                      // 通道编号
        amqp_cstring_bytes("hello"),  // 队列名称
        0,  // passive  0代表不存在则创建，1代表不存在时报错
        0,  // durable  0代表队列持久化，在消费者断开连接后保留，1代表队列在消费者断开连接后删除
        0,  // exclusive  0代表队列可以被多个连接共享，1代表队列仅对当前连接可见，连接关闭后自动删除
        0,  // auto_delete  0消费者断开连接后队列不自动删除
        amqp_empty_table  // arguments
    );
    
    reply = amqp_get_rpc_reply(conn);
    if (reply.reply_type != AMQP_RESPONSE_NORMAL) {
        fprintf(stderr, "声明队列失败\n");
        return 1;
    }
    
    // 准备消息内容
    char message[] = "Hello World!";
    amqp_bytes_t message_bytes = amqp_cstring_bytes(message);
    
    // 发布消息
    amqp_basic_properties_t props;
    props._flags = AMQP_BASIC_CONTENT_TYPE_FLAG;
    props.content_type = amqp_cstring_bytes("text/plain");
    
    
    int ret = amqp_basic_publish(
        conn,                    // 连接
        channel,                       // 通道
        amqp_cstring_bytes(""),  // exchange (空字符串表示默认exchange)
        amqp_cstring_bytes("hello"),  // routing key (队列名称)
        0,                       // mandatory
        0,                       // immediate
        &props,                  // 消息属性
        message_bytes            // 消息体
    );
    
    if (ret < 0) {
        fprintf(stderr, "发布消息失败\n");
        return 1;
    }
    
    printf(" [x] Sent 'Hello World!'\n");
    
    sleep(1000);

    // 关闭连接
    amqp_channel_close(conn, 1, AMQP_REPLY_SUCCESS);
    amqp_connection_close(conn, AMQP_REPLY_SUCCESS);
    amqp_destroy_connection(conn);
    
    return 0;
}